﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Yglab.Models;
using FluentDateTime;

namespace Yglab.MyLib
{
    public class MyCronjob
    {
        private YgContext conn = new YgContext();

        public DateTime getTime()
        {
            MySettings m = conn.MySettings.FirstOrDefault();
            return DateTime.Now.AddDays(m.DayNo);
        }

        public DateTime OneDaysLater()
        {
            return this.getTime().Midnight() + 1.Days();
        }

        public DateTime StartOfWeek()
        {
            return getTime().FirstDayOfWeek().Midnight() + 1.Weeks();
        }

        public void run()
        {
            run1(); run2(); run3(); run4();
        }

        //1: derginin yeni sayısının yayınlanma zamanı geldi, yayınla. kuyruktan makaleler çekilecek.
        public void run1()
        {
            DateTime t = this.getTime();
            List<Journal> journals = conn.Journals.Include("Articles").Where(j => j.NextPubDate >= t).ToList();
            
            foreach (Journal j in journals)
            {
                if (j.Articles.Where(a => a.State == 3).ToList().Count >= j.ArticleNum)
                {
                    Publication newPub = new Publication { Journal = j, PubDate = j.NextPubDate };
                    newPub.Articles = new List<Article>();
                    foreach (Article a in j.Articles.Where(a => a.State == 3).Take(j.ArticleNum).ToList())
                    {
                        a.State = 4;
                        newPub.Articles.Add(a);
                    }
                    j.NextPubDate = this.StartOfWeek() + 1.Weeks();
                    conn.Publications.Add(newPub);
                }
            }

            conn.SaveChanges();
        }

        //2: makalenin hakemler tarafından değerlendirilmesinin vakti doldu. değerlendirmesini yapmamış hakemleri es geç
        public void run2()
        {
        }

        //3: makale için yeni versiyon oluşturma vakti doldu. Makaleyi otomatik olarak reddet. notification oluştur.
        public void run3()
        {

        }
        //4: editör olma davetine cevap verme son tarihi geldi. reddet. invitaion ı sil. ve ilgili notificationı (notification 3) oluştur.
        public void run4()
        {
        }
    }
}